package codigoGerado;

import java_cup.runtime.*;

%%

%class AnalisadorLexico
%public
%column
%line
%cup

%{
	private Symbol symbol(int type){
		return new Symbol(type, yyline,yycolumn);
	}

	private Symbol symbol(int type, Object value){
		return new Symbol(type, yyline,yycolumn, value);
	}

	private void mensagemErro() {
		throw new RuntimeException("Erro Lexico na linha " + yyline + " e coluna " + yycolumn + " . Nao existe padrao para o lexema: " + yytext());
	}
%}

numero = [0-9]+
letra = [a-zA-Z]
inteiro = [+-]?{numero}

%%

"/*"([ -~] | [^\n\r] | [\t\f\n\r])*"*/"	{											}
"--"([ -~])*							{ 											}
"--"([^\n\r])*([-~])*[\n\r]				{ 											}
"begin"              					{ return symbol(sym.BEGIN); 				}
"BEGIN"              					{ return symbol(sym.BEGIN); 				}
"end"              						{ return symbol(sym.END); 					}
"END"              						{ return symbol(sym.END); 					}
"is"              						{ return symbol(sym.IS); 					}
"IS"              						{ return symbol(sym.IS); 					}
"as"              						{ return symbol(sym.AS); 					}
"AS"              						{ return symbol(sym.AS); 					}
"create"              					{ return symbol(sym.CREATE); 				}
"CREATE"              					{ return symbol(sym.CREATE); 				}
"procedure"              				{ return symbol(sym.PROC); 					}
"PROCEDURE"              				{ return symbol(sym.PROC); 					}
"function"              				{ return symbol(sym.FUNC); 					}
"FUNCTION"              				{ return symbol(sym.FUNC); 					}
"cursor"              					{ return symbol(sym.CURSOR); 				}
"CURSOR"              					{ return symbol(sym.CURSOR); 				}
"replace"              					{ return symbol(sym.REPLACE); 				}
"REPLACE"              					{ return symbol(sym.REPLACE); 				}
"declare"              					{ return symbol(sym.DECLARE); 				}
"DECLARE"              					{ return symbol(sym.DECLARE); 				}
"open"              					{ return symbol(sym.OPEN); 					}
"OPEN"              					{ return symbol(sym.OPEN); 					}
"close"              					{ return symbol(sym.CLOSE); 				}
"CLOSE"              					{ return symbol(sym.CLOSE); 				}
"fetch"              					{ return symbol(sym.FETCH); 				}
"FETCH"              					{ return symbol(sym.FETCH); 				}
"when"              					{ return symbol(sym.WHEN); 					}
"WHEN"              					{ return symbol(sym.WHEN); 					}
"return"    		   		            { return symbol(sym.RETURN); 				}
"RETURN"    		   		            { return symbol(sym.RETURN); 				}
"in"              						{ return symbol(sym.IN); 					}
"IN"              						{ return symbol(sym.IN); 					}
"out"              						{ return symbol(sym.OUT); 					}
"OUT"              						{ return symbol(sym.OUT); 					}
"||"              						{ return symbol(sym.CONCAT); 				}
"default"              					{ return symbol(sym.DEFAULT); 				}
"DEFAULT"              					{ return symbol(sym.DEFAULT); 				}
"<<"              						{ return symbol(sym.OPLABEL); 				}
">>"              						{ return symbol(sym.CLLABEL); 				}
"zero_divide"             	 			{ return symbol(sym.ZERODIVIDE); 			}
"ZERO_DIVIDE"             	 			{ return symbol(sym.ZERODIVIDE); 			}
"no_data_found"            	 			{ return symbol(sym.NODATAFOUND); 			}
"NO_DATA_FOUND"            	 			{ return symbol(sym.NODATAFOUND); 			}
"others"  		          	 			{ return symbol(sym.OTHERS);	 			}
"OTHERS"  		          	 			{ return symbol(sym.OTHERS);	 			}
"exception"              				{ return symbol(sym.EXCEPTION); 			}
"EXCEPTION"              				{ return symbol(sym.EXCEPTION); 			}
"continue"              				{ return symbol(sym.CONTINUE);			 	}
"CONTINUE"              				{ return symbol(sym.CONTINUE);			 	}
"case" 		             				{ return symbol(sym.CASE);				 	}
"CASE" 		             				{ return symbol(sym.CASE);				 	}
"goto"              					{ return symbol(sym.GOTO); 					}
"GOTO"              					{ return symbol(sym.GOTO); 					}
"break"               					{ return symbol(sym.BREAK); 				}
"BREAK"               					{ return symbol(sym.BREAK); 				}
"exit"              					{ return symbol(sym.EXIT); 					}
"EXIT"              					{ return symbol(sym.EXIT); 					}
"true"              					{ return symbol(sym.TRUE); 					}
"TRUE"              					{ return symbol(sym.TRUE); 					}
"false"              					{ return symbol(sym.FALSE); 				}
"FALSE"              					{ return symbol(sym.FALSE); 				}
"null"              					{ return symbol(sym.NULL); 					}
"NULL"              					{ return symbol(sym.NULL); 					}
"for"                   				{ return symbol(sym.FOR); 					}
"FOR"                   				{ return symbol(sym.FOR); 					}
"while"              					{ return symbol(sym.WHILE); 				}
"WHILE"              					{ return symbol(sym.WHILE); 				}
"loop"              					{ return symbol(sym.LOOP); 					}
"LOOP"              					{ return symbol(sym.LOOP); 					}
"reverse"              					{ return symbol(sym.REVERSE); 				}
"REVERSE"              					{ return symbol(sym.REVERSE); 				}
"if"            						{ return symbol(sym.IF); 					}
"IF"            						{ return symbol(sym.IF); 					}
"else"            						{ return symbol(sym.ELSE); 					}
"ELSE"            						{ return symbol(sym.ELSE); 					}
"elsif"            						{ return symbol(sym.ELSIF); 				}
"ELSIF"            						{ return symbol(sym.ELSIF); 				}
"then"              					{ return symbol(sym.THEN); 					}
"THEN"              					{ return symbol(sym.THEN); 					}
"insert"              					{ return symbol(sym.INSERT); 				}
"INSERT"              					{ return symbol(sym.INSERT); 				}
"select"              					{ return symbol(sym.SELECT); 				}
"SELECT"              					{ return symbol(sym.SELECT); 				}
"from"              					{ return symbol(sym.FROM); 					}
"FROM"              					{ return symbol(sym.FROM); 					}
"where"              					{ return symbol(sym.WHERE); 				}
"WHERE"              					{ return symbol(sym.WHERE); 				}
"update"              					{ return symbol(sym.UPDATE); 				}
"UPDATE"              					{ return symbol(sym.UPDATE); 				}
"set"              						{ return symbol(sym.SET); 					}
"SET"              						{ return symbol(sym.SET); 					}
"min"              						{ return symbol(sym.MIN); 					}
"MIN"              						{ return symbol(sym.MIN); 					}
"max"              						{ return symbol(sym.MAX); 					}
"MAX"              						{ return symbol(sym.MAX); 					}
"values"              					{ return symbol(sym.VALUES); 				}
"VALUES"              					{ return symbol(sym.VALUES); 				}
":="              						{ return symbol(sym.ATR); 					}
"into"             					 	{ return symbol(sym.INTO); 					}
"INTO"             					 	{ return symbol(sym.INTO); 					}
"varchar"              					{ return symbol(sym.VARCHAR); 				}
"VARCHAR"              					{ return symbol(sym.VARCHAR); 				}
"varchar2"              				{ return symbol(sym.VARCHAR); 				}
"VARCHAR2"              				{ return symbol(sym.VARCHAR); 				}
"boolean"            					{ return symbol(sym.BOOLEAN); 				}
"BOOLEAN"            					{ return symbol(sym.BOOLEAN); 				}
"float"            						{ return symbol(sym.FLOAT);			 		}
"FLOAT"            						{ return symbol(sym.FLOAT);			 		}
"number"            					{ return symbol(sym.NUMBER); 				}
"NUMBER"            					{ return symbol(sym.NUMBER); 				}
"binary_integer"            			{ return symbol(sym.BINARYINT); 			}
"BINARY_INTEGER"            			{ return symbol(sym.BINARYINT); 			}
"integer"		            			{ return symbol(sym.INT);	 				}
"INTEGER"		            			{ return symbol(sym.INT);	 				}
"int"			            			{ return symbol(sym.INT);	 				}
"INT"			            			{ return symbol(sym.INT);	 				}
"natural"            					{ return symbol(sym.NATURAL); 				}
"NATURAL"            					{ return symbol(sym.NATURAL); 				}
"positive"            					{ return symbol(sym.POSITIVE); 				}
"POSITIVE"            					{ return symbol(sym.POSITIVE); 				}
"date"            						{ return symbol(sym.DATE); 					}
"DATE"            						{ return symbol(sym.DATE); 					}
"and"              						{ return symbol(sym.AND); 					}
"AND"              						{ return symbol(sym.AND); 					}
"or"              						{ return symbol(sym.OR); 					}
"OR"              						{ return symbol(sym.OR); 					}
"not"              						{ return symbol(sym.NOT); 					}
"NOT"              						{ return symbol(sym.NOT); 					}
"%type"              					{ return symbol(sym.TYPE); 					}
"%TYPE"              					{ return symbol(sym.TYPE); 					}
"between"              					{ return symbol(sym.BETWEEN); 				}
"BETWEEN"              					{ return symbol(sym.BETWEEN); 				}
"%notfound"              				{ return symbol(sym.NOTFOUND); 				}
"%NOTFOUND"              				{ return symbol(sym.NOTFOUND); 				}
"%isopen"              					{ return symbol(sym.ISOPEN); 				}
"%ISOPEN"              					{ return symbol(sym.ISOPEN); 				}
"%rowtype"              				{ return symbol(sym.ROWTYPE); 				}
"%ROWTYPE"              				{ return symbol(sym.ROWTYPE); 				}
"constant"              				{ return symbol(sym.CONSTANT); 				}
"CONSTANT"              				{ return symbol(sym.CONSTANT); 				}
"commit"              					{ return symbol(sym.COMMIT); 				}
"COMMIT"              					{ return symbol(sym.COMMIT); 				}
"raise"              					{ return symbol(sym.RAISE); 				}
"RAISE"              					{ return symbol(sym.RAISE); 				}
";"              						{ return symbol(sym.SEMICOLON); 			}
","              						{ return symbol(sym.COMMA); 				}
"."              						{ return symbol(sym.DOT); 					}
"("              						{ return symbol(sym.OPPAR); 				}
")"              						{ return symbol(sym.CLPAR); 				}
"'"              						{ return symbol(sym.QUOTE); 				}
">"              						{ return symbol(sym.GT); 					}
"<"              						{ return symbol(sym.LT); 					}
"<>"              						{ return symbol(sym.NE); 					}
"!="              						{ return symbol(sym.NE); 					}
"^="              						{ return symbol(sym.NE); 					}
"="              						{ return symbol(sym.EQ); 					}
"<="              						{ return symbol(sym.LE); 					}
">="              						{ return symbol(sym.GE); 					}
"+"              						{ return symbol(sym.PLUS); 					}
"-"              						{ return symbol(sym.MINUS); 				}
"/"              						{ return symbol(sym.DIV); 					}
"*"              						{ return symbol(sym.TIMES); 				}
{inteiro}	          	 				{ return symbol(sym.INTEGER, yytext());		}
{inteiro}\.{numero}([eE][+-]?{numero})?	{ return symbol(sym.DOUBLE, yytext());		}
({letra} | _)({letra} | {numero} | _)*	{ return symbol(sym.ID, yytext()); 		}
"'"([ -&(-~]  | \\')*"'"  			    { return symbol(sym.STRING, yytext());		}
[ \r\n\t\f] 							{ 		 									}
<<EOF>> 								{ return symbol(sym.EOF); 					}
.|\n 									{ mensagemErro();							}